home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 3: CDPD 3
/
Almathera Ten on Ten - Disc 3: CDPD3.iso
/
ab20
/
unarced
/
graphics
/
anim
/
putanim.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-03-17
|
4KB
|
162 lines
/* putanim.c
* opens an animation iff file by outputing the starting
* bitmap. Then successive change frames may be output
* followed by closing the file.
*
* written by G. Bonham May 1986
* SPARTA, Inc.
* Laguna Hills, Calif
*/
#include "intuall.h"
#include "gio.h"
#include "ilbm.h"
#include "putanim.h"
#include "functions.h"
#include "stdio.h"
#define BODY_BUFSIZE 512
#define MaxDepth 5
#define CkErr(exp) {if(ifferror==IFF_OKAY)ifferror=(exp);}
extern UBYTE BMmask;
extern int Pop;
GroupContext fileC, form1C, form2C;
static IFFP ifferror = 0;
BYTE *Bufsave;
LONG Bufsizesave;
static UWORD bHw,bHh;
static WORD bHx,bHy;
/* =================================================== */
BOOL OpenAnim(file,bm,pageW,pageH,colorMap,modes,buffer,bufsize)
UWORD modes;
LONG file;
struct BitMap *bm;
WORD pageW,pageH;
WORD *colorMap;
BYTE *buffer; LONG bufsize;
{
UBYTE depth;
BitMapHeader bmHdr;
ULONG lmodes;
lmodes = modes;
ifferror = InitBMHdr(&bmHdr,bm,(WORD)mskNone,(WORD)cmpByteRun1
,0,pageW,pageH);
if(ifferror != IFF_OKAY) printf("iff error: %d\n",ifferror);
if (ifferror == IFF_OKAY && bufsize > 2 * BODY_BUFSIZE) {
if (GWriteDeclare(file,buffer+BODY_BUFSIZE
,(long)(bufsize-BODY_BUFSIZE)) < 0)
ifferror = DOS_ERROR;
bufsize = BODY_BUFSIZE;
}
depth = bm->Depth;
if (depth > 5) depth = 5;
CkErr(OpenWIFF(file,&fileC,(long)szNotYetKnown));
CkErr(StartWGroup(&fileC,(ID)FORM,(long)szNotYetKnown,ID_ANIM,&form1C));
CkErr(StartWGroup(&form1C,(ID)FORM,(long)szNotYetKnown,ID_ILBM,&form2C));
CkErr(PutCk(&form2C,ID_BMHD,(long)sizeof(BitMapHeader),(BYTE *)&bmHdr));
if (colorMap) CkErr(PutCMAP(&form2C,colorMap,depth));
CkErr(PutCk(&form2C,ID_CAMG,(long)sizeof(CamgChunk),(BYTE *)&lmodes));
CkErr(PutBODY(&form2C,bm,(long)NULL,&bmHdr,buffer,(long)bufsize));
CkErr(EndWGroup(&form2C));
CkErr(CloseWGroup(&form1C));
if(ifferror != IFF_OKAY) printf("openanim - iff error: %d\n",ifferror);
return((BOOL)(ifferror != IFF_OKAY));
}
BOOL AddAnim(bm,pageW,pageH,pop,buffer,bufsize)
struct BitMap *bm;
WORD pageW,pageH,pop;
BYTE *buffer;
LONG bufsize;
{
AnimationHeader animHdr;
BitMapHeader bmHdr;
/* InitBMHdr sets w and h and x and y in bmHdr */
Pop = pop;
ifferror = InitBMHdr(&bmHdr,bm,(WORD)mskNone,(WORD)cmpByteRun1
,0,pageW,pageH);
bHx = bmHdr.x;
bHy = bmHdr.y;
bHw = bmHdr.w;
bHh = bmHdr.h;
ifferror = InitAnimHdr(&animHdr,pop);
if(ifferror != IFF_OKAY) printf("iff error: %d\n",ifferror);
CkErr(OpenWGroup(&fileC,&form1C));
CkErr(StartWGroup(&form1C,(ID)FORM,(long)szNotYetKnown,ID_ILBM,&form2C));
CkErr(PutCk(&form2C,ID_ANHD,(long)sizeof(AnimationHeader),(BYTE *)&animHdr));
CkErr(PutBODY(&form2C,bm,(long)NULL,&bmHdr,buffer,(long)bufsize));
CkErr(EndWGroup(&form2C));
CkErr(CloseWGroup(&form1C));
if(ifferror != IFF_OKAY) printf("addanim - iff error: %d\n",ifferror);
return((BOOL)(ifferror != IFF_OKAY));
}
BOOL AddAnim2(data,ndata,pop)
int pop;
LONG *data;
LONG ndata;
{
AnimationHeader animHdr;
ifferror = InitAnimHdr(&animHdr,pop);
if(ifferror != IFF_OKAY) printf("iff error: %d\n",ifferror);
CkErr(OpenWGroup(&fileC,&form1C));
CkErr(StartWGroup(&form1C,(ID)FORM,(long)szNotYetKnown,ID_ILBM,&form2C));
CkErr(PutCk(&form2C,ID_ANHD,(long)sizeof(AnimationHeader),(BYTE *)&animHdr));
CkErr(PutCk(&form2C,ID_DLTA,ndata,data));
CkErr(EndWGroup(&form2C));
CkErr(CloseWGroup(&form1C));
if(ifferror != IFF_OKAY) printf("addanim - iff error: %d\n",ifferror);
return((BOOL)(ifferror != IFF_OKAY));
}
BOOL CloseAnim(file)
LONG file;
{
Pop = 0;
CkErr(PutCkEnd(&fileC));
CkErr(CloseWGroup(&fileC));
if (GWriteUndeclare(file) < 0 && ifferror == IFF_OKAY) ifferror = DOS_ERROR;
return ((BOOL)(ifferror != IFF_OKAY));
}
BOOL InitAnimHdr(aH,op)
AnimationHeader *aH;
WORD op;
{
int i;
aH->operation = op;
aH->mask = 0;
aH->x = 0;
aH->y = 0;
aH->w = 0;
aH->h = 0;
aH->interleave = 0;
aH->reltime = 0;
aH->abstime = 0;
aH->bits = 0;
aH->pad0 = 0;
for (i=0;i<16;i++) aH->pad[i] = 0;
return(0);
}